const Menus = require('../db/models/menuSchema')
const Role = require('../db/models/roleSchema')
const Counter = require('../db/models/counterSchema')
const { successModel, errorModel, code } = require("../utils/stateModel")
const { getMenuTree, delMenuTree } = require('../utils/operatMenu')
const jwt = require("jsonwebtoken")
const SECRET = process.env.JWT_SECRET

//查询菜单列表
const queryMenus = async (ctx, params) => {
    /**
     * 列表 token 反解析值 userList
     * {
     *   _id: '62f34566bdc6c9b27b7fb1ab',
     *   userId: 0,
     *   username: 'admin',
     *   roleNames: []
     * }
     */
    //从token中获取用户列表
    const { userList } = jwt.verify(ctx.headers.token, SECRET)
    //查询
    const resRole = await Role.find({ _id: { $in: userList.roleNames } })
    let menuIds = []
    resRole.forEach((item) => {
        menuIds = menuIds.concat(item.permId)
    })
    let { menuType, _ids, menuNum } = params
    if (_ids) {
        _ids = JSON.parse(_ids)
    }
    let selectParms = {}
    let conditionParms = {}
    if (menuType == 1) {
        selectParms.menuType = 1
    }
    //如果用户名为admin 默认获取全部菜单权限
    if (menuNum || userList.username == 'admin') {
        if (userList.username == 'admin') {
            //创建菜单管理菜单 便于创建后续菜单,运行一次后可注释掉  
            const exitMenu = await Menus.findOne({ name: '菜单管理' })
            if (!exitMenu) {
                await Menus.create({
                    id: 0,
                    menuType: 1,
                    url: '/sys/menu',
                    name: '菜单管理',
                    icon:'el-icon-menu',
                    parentId:null,
                    orderNum: 0
                })
            }
        }
        conditionParms = {}
    } else {
        conditionParms = { _id: { $in: menuIds } }
    }
    const res = await Menus.find({ ...selectParms, ...conditionParms }).sort({ 'orderNum': 1 })//根据orderNum排序
    // console.log(JSON.stringify(res), 'res')
    if (res) {
        const menuArr = getMenuTree(res, null, [])
        // console.log(JSON.stringify(menuArr), 'menuArr')
        ctx.body = new successModel(menuArr, "查询成功")
        return
    }
    ctx.body = new errorModel("查询失败", code.DB_ERROR)
}
//新增编辑菜单
const addMenus = async (ctx, params) => {
    const { menuType, name, url, icon, limitCode, parentId, orderNum, level, updateTime, _id, action } = params
    const body = { menuType, name, url, icon, limitCode, parentId, orderNum, level, updateTime }
    //新增
    if (action == 0) {
        try {
            //这一步运行一次就可以注释掉，自增需要有个初始值
            const res = await Counter.findOne({ id: "menuId" })
            if (!res) {
                await Counter.create({
                    "id": "menuId",
                    "sequence_value": 1
                })
            }
            const doc = await Counter.findOneAndUpdate({ id: 'menuId' }, { $inc: { sequence_value: 1 } }, { new: true })
            if (!doc) {
                ctx.body = new errorModel("新增失败", code.DB_ERROR)
                return
            }
            await Menus.create({ id: doc.sequence_value, ...body })
            ctx.body = new successModel("新增成功")
        } catch (error) {
            ctx.body = new errorModel("新增失败", code.DB_ERROR)
        }
        return
    }
    //编辑
    try {
        const res = await Menus.findOneAndUpdate({ _id }, body)
        if (!res) {
            ctx.body = new errorModel("更新失败", code.DB_ERROR)
            return
        }
        ctx.body = new successModel("更新成功")
    } catch (error) {
        ctx.body = new errorModel("更新失败", code.DB_ERROR)
    }
}
//删除菜单
const delMenuList = async (ctx, _id) => {
    const res = await Menus.find()
    const _ids = delMenuTree(res, _id, [])
    const delIts = await Menus.deleteMany({ _id: _ids })
    if (delIts) {
        ctx.body = new successModel(`删除成功${delIts.deletedCount}条`)
        return
    }
    ctx.body = new errorModel("删除失败", code.DB_ERROR)
}
module.exports = { queryMenus, addMenus, delMenuList }
/**
 *
 * 　　　┏┓　　　┏┓
 * 　　┏┛┻━━━┛┻┓
 * 　　┃　　　　　　　┃
 * 　　┃　　　━　　　┃
 * 　　┃　┳┛　┗┳　┃
 * 　　┃　　　　　　　┃
 * 　　┃　　　┻　　　┃
 * 　　┃　　　　　　　┃
 * 　　┗━┓　　　┏━┛Code is far away from bug with the animal protecting
 * 　　　　┃　　　┃    神兽保佑,代码无bug
 * 　　　　┃　　　┃
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　 ┣┓
 * 　　　　┃　　　　 ┏┛
 * 　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 *
 */